访问电脑版页面

导航:老古开发网手机版STM32单片机STM32单片机的ADC

基于STM32单片机的ADC与DMA配置的介绍与使用

导读:
关键字:
STM32单片机,dma,adc,

本文使用ADC转换电位器输出的电压值,并用DMA模式传输转换的结果,每8次采样转换取平均值,做一个简单的数字滤波。

ADC的详细配置与使用

见之前的日记STM32中ADC的使用,只是最后增加一步配置DMA:

DMA for ADC channels features configuraTIon

? To enable the DMA mode for ADC channels group, use the ADC_DMACmd()funcTIon.

? To configure the DMA transfer request, use ADC_DMAConfig() funcTIon.

DMA的配置

(摘自STM32F3官方用户手册UM1581User manual)

1. Enable The DMA controller clock using

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE) funcTIon for DMA1 orusing RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE) function forDMA2.

2. Enable and configure the peripheral to be connected to the DMA channel (except forinternal SRAM / FLASH memories: no initialization is necessary)。

3. For a given Channel, program the Source and Destination addresses, the transferDirection, the Buffer Size, the Peripheral and Memory Incrementation mode and Data

Size, the Circular or Normal mode, the channel transfer Priority and the Memory-to-Memory transfer mode (if needed) using the DMA_Init() function.

4. Enable the NVIC and the corresponding interrupt(s) using the function

DMA_ITConfig() if you need to use DMA interrupts.

5. Enable the DMA channel using the DMA_Cmd() function.

6. Activate the needed channel Request using PPP_DMACmd() function for any PPPperipheral except internal SRAM and FLASH (ie. SPI, USART 。..) The functionallowing this operation is provided in each PPP peripheral driver (ie. SPI_DMACmd forSPI peripheral)。

7. Optionally, you can configure the number of data to be transferred when the channel

is disabled (ie. after each Transfer Complete event or when a Transfer Error occurs)using the function DMA_SetCurrDataCounter()。 And you can get the number ofremaining data to be transferred using the function DMA_GetCurrDataCounter() at runtime (when the DMA channel is enabled and running)。

8. To control DMA events you can use one of the following two methods:

a. Check on DMA channel flags using the function DMA_GetFlagStatus()。

b. Use DMA interrupts through the function DMA_ITConfig() at initialization phaseand DMA_GetITStatus() function into interrupt routines in communication phase.After checking on a flag you should clear it using DMA_ClearFlag() function. Andafter checking on an interrupt event you should clear it usingDMA_ClearITPendingBit()function.

重要代码:

#include“ADC_DMA.h”

#defineDATANUM8

uint8_tFLAG=0;//转换次数标志位

uint16_tCONV_RESULTS[DATANUM];

voidADC_Config(void)

{

ADC_InitTypeDefADC_InitStructure;

ADC_CommonInitTypeDefADC_CommonInitStructure;

RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div2);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12,ENABLE);

//GPIO_Config();//实现采样输入引脚的配置,配置为模拟输入模式

//。..。..其他

ADC_CommonInitStructure.ADC_DMAAccessMode=ADC_DMAAccessMode_2;

ADC_CommonInitStructure.ADC_DMAMode=ADC_DMAMode_Circular;

//。..。..。其他

ADC_CommonInit(USING_ADC,&ADC_CommonInitStructure);

//ADCInit,ADC_Init(USING_ADC,&ADC_InitStructure);

ADC_ITConfig(USING_ADC,ADC_IT_EOC,ENABLE);//开中断

ADC_DMAConfig(USING_ADC,ADC_DMAMode_Circular);//配置ADC_DMA,非常重要

ADC_DMACmd(USING_ADC,ENABLE);//打开ADC_DMA

DMA_Config();

ADC_Cmd(USING_ADC,ENABLE);

while(!ADC_GetFlagStatus(USING_ADC,ADC_FLAG_RDY));

ADC_StartConversion(USING_ADC);

}

voidGPIO_Config(void)

{

//。..。..。

//。..。..

}

voidDMA_Config(void)

{

DMA_InitTypeDefDMA_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

DMA_DeInit(DMA1_Channel1);

DMA_InitStructure.DMA_PeripheralBaseAddr=ADC_DATA_ADDR;//ADC数据寄存器DR的地址

DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&CONV_RESULTS;//存放转换结果的地址

DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;

DMA_InitStructure.DMA_BufferSize=DATANUM;

//。..。.

DMA_Init(DMA1_Channel1,&DMA_InitStructure);

DMA_Cmd(DMA1_Channel1,ENABLE);

}

voidADC1_2_IRQHandler(void)

{

FLAG++;//在主函数中检查FLAG并惊醒处理

//计算转换数据的个数

if(FLAG》DATANUM-1)

{

FLAG=0;

}

ADC_ClearITPendingBit(USING_ADC,ADC_IT_EOC);

}

//获取转换结果的平均值,做滤波处理

uint16_tGetAverage(void)

{

u8i=0;

u16average=0;

u32sum=0,voltage=0;

for(i=0;i

{

sum+=CONV_RESULTS[i];

}

average=sum/DATANUM;

voltage=average*3300/0xFFF;

returnvoltage;

}

//配置中断

voidNVIC_Config(void)

{

NVIC_InitTypeDefNVIC_InitStruct;

NVIC_InitStruct.NVIC_IRQChannel=ADC1_IRQn;

//。..。..。.

NVIC_Init(&NVIC_InitStruct);

}

来源:未知   作者:工程师周亮  2018/11/15 16:05:00
栏目: [ STM32单片机的ADC]

相关阅读

一文带你看懂Stm32定时器+ADC+DMA进行AD采样的实现

STM32学习笔记之ADC转换

基于STM32单片机的ADC与DMA配置的介绍与使用

STM32单片机ADC库函数的定义和使用方法

STM32单片机对ADS1246芯片的驱动

STM32 ADC应用要注意的几点问题

STM32单片机如何实现规则多通道转换

Stm32f103 ADC 学习笔记

如何实现STM32F407单片机的ADC转换

STM32单片机的定时器和ADC的应用方法介绍

STM32:ADC采集数据实例(采用DMA模式)

一种经典的STM32 ADC多通道转换详细解析

介绍一种关于STM32 ADC 多通道16路电压采集技术

STM32的ADC转换最常见的方式

STM32的ADC编程方法总结

基于STM32内置ADC实现简易示波器的程序设计与实现

如何在STM32中得到最佳的ADC精度

STM32单片机的ADC多通道采样

基于STM32单片机ADC连续采集和DMA循环转换

一文读懂STM32f030c8t6单片机ADC模拟看门狗的使用